home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / MyEnterPassword.p < prev    next >
Encoding:
Text File  |  1994-09-27  |  3.3 KB  |  148 lines  |  [TEXT/PJMM]

  1. unit MyEnterPassword;
  2.  
  3. interface
  4.  
  5.     procedure CreateEnterPassword (var p: ptr; dlg: DialogPtr; item: integer);
  6.     procedure DisposeEnterPassword (var p: ptr);
  7.     procedure HandleEnterPassword (p: ptr; dlg: DialogPtr; var er: EventRecord);
  8.     procedure GetEnterPassword (p: ptr; var password: str255);
  9.     procedure SetEnterPassword (var p: ptr; password: str255);
  10.     procedure PasteEnterPassword (p: ptr; h: handle);
  11.  
  12. implementation
  13.  
  14.     uses
  15.         MyStrings, MyTypes, MyUtils, MyDialogs, QLowLevel;
  16.  
  17.     const
  18.         my_bullet = '•';
  19.  
  20.     type
  21.         EPRecord = record
  22.                 teh: TEHandle;
  23.                 dlg: DialogPtr;
  24.                 item: integer;
  25.             end;
  26.         EPRecordPtr = ^EPRecord;
  27.  
  28.     procedure CreateEnterPassword (var p: ptr; dlg: DialogPtr; item: integer);
  29.         var
  30.             dest, view: Rect;
  31.             ep: EPRecordPtr;
  32.             h: CharsHandle;
  33.     begin
  34.         SetPort(dlg);
  35.         p := NewPtr(SizeOf(EPRecord));
  36.         ep := EPRecordPtr(p);
  37.         SetRect(dest, 8000, 8010, 8100, 8020);
  38.         view := dest;
  39.         ep^.teh := TENew(dest, view);
  40.         ep^.dlg := dlg;
  41.         ep^.item := item;
  42.         h := TEGetText(ep^.teh);
  43.     end;
  44.  
  45.     procedure DisposeEnterPassword (var p: ptr);
  46.         var
  47.             ep: EPRecordPtr;
  48.     begin
  49.         ep := EPRecordPtr(p);
  50.         TEDispose(ep^.teh);
  51.         DisposePtr(ptr(ep));
  52.         p := nil;
  53.     end;
  54.  
  55.     procedure SetEnterPassword (var p: ptr; password: str255);
  56.         var
  57.             ep: EPRecordPtr;
  58.             i: integer;
  59.     begin
  60.         ep := EPRecordPtr(p);
  61.         TESetText(@password[1], length(password), ep^.teh);
  62.         for i := 1 to length(password) do begin
  63.             password[i] := my_bullet;
  64.         end;
  65.         SetItemText(ep^.dlg, ep^.item, password);
  66.     end;
  67.  
  68.     procedure GetEnterPassword (p: ptr; var password: str255);
  69.         var
  70.             ep: EPRecordPtr;
  71.             h: CharsHandle;
  72.     begin
  73.         ep := EPRecordPtr(p);
  74.         h := TEGetText(ep^.teh);
  75.         HandleToString(h, password);
  76.     end;
  77.  
  78.     procedure HandleEnterPassword (p: ptr; dlg: DialogPtr; var er: EventRecord);
  79.         var
  80.             ep: EPRecordPtr;
  81.             ch: Char;
  82.     begin
  83.         ep := EPRecordPtr(p);
  84.         if (ep^.dlg = dlg) & (SelectedTextItem(dlg) = ep^.item) then begin
  85.             if er.what in [keyDown, AutoKey] then begin
  86.                 ch := chr(BAND(er.message, charCodeMask));
  87.                 case ch of
  88.                     cr, enter, tab, leftArrow, rightArrow, upArrow, downArrow: 
  89.                         ;
  90.                     otherwise begin
  91.                         if (ch <> bs) & (ch < spc) then begin
  92.                             SysBeep(1);
  93.                             er.what := nullEvent;
  94.                         end
  95.                         else begin
  96.                             TESetSelect(dialogPeek(dlg)^.textH^^.selStart, dialogPeek(dlg)^.textH^^.selEnd, ep^.teh);
  97.                             TEKey(ch, ep^.teh);
  98.                             if (ch <> bs) & DirtyKey(ch) then begin
  99.                                 er.message := ord(my_bullet);
  100.                             end;
  101.                         end;
  102.                     end;
  103.                 end;
  104.             end;
  105.         end;
  106.     end;
  107.  
  108.     procedure PasteEnterPassword (p: ptr; h: handle);
  109.         var
  110.             ep: EPRecordPtr;
  111.             ch: Char;
  112.             len: longInt;
  113.             i: integer;
  114.             s: str255;
  115.             bad: boolean;
  116.             th: TEHandle;
  117.     begin
  118.         ep := EPRecordPtr(p);
  119.         if (SelectedTextItem(ep^.dlg) = ep^.item) then begin
  120.             len := GetHandleSize(h);
  121.             bad := len > 255;
  122.             if not bad then begin
  123.                 for i := 0 to len - 1 do begin
  124.                     if BAND(AddPtrLong(h^, i)^, $FF) < 32 then begin
  125.                         bad := true;
  126.                         leave;
  127.                     end;
  128.                 end;
  129.             end;
  130.             if bad then begin
  131.                 SysBeep(1);
  132.             end
  133.             else begin
  134.                 th := dialogPeek(ep^.dlg)^.textH;
  135.                 HLock(h);
  136.                 TESetSelect(th^^.selStart, th^^.selEnd, ep^.teh);
  137.                 TEDelete(ep^.teh);
  138.                 TEInsert(h^, len, ep^.teh);
  139.                 s[0] := chr(len);
  140.                 for i := 1 to len do begin
  141.                     s[i] := my_bullet;
  142.                 end;
  143.                 TEDelete(th);
  144.                 TEInsert(@s[1], len, th);
  145.             end;
  146.         end;
  147.     end;
  148. end.